package ig.finanzas;

import ig.util.excepciones.DatoInvalidoExcepcion;
import java.io.Serializable;
import java.util.Date;

/**
 * Define la estructura y comportamiento de un pago o captacion de dinero. 
 * @author lfgarcia
 */
public class Flujo implements Serializable, Comparable {
	static final long serialVersionUID = 01;
	/**
	 * @uml.property  name="fecha"
	 * @uml.associationEnd  
	 */
	private Date fecha;
	/**
	 * @uml.property  name="capital"
	 */
	private double capital;
	/**
	 * @uml.property  name="interesfijo"
	 */
	private double interesfijo;
	/**
	 * @uml.property  name="interesvariable"
	 */
	private double interesvariable;
	/**
	 * Define si la parte variable del flujo es conocida o no.
	 * @uml.property  name="conocido"
	 */
	private boolean conocido;
	
        private boolean formulado;
	/**
	 * Constructor de la clase.
	 * @param fecha
	 * @param capital
	 * @param interesfijo
	 * @param interesvariable
	 * @param conocido
	 * @throws DatoInvalidoExcepcion Si la fecha suministrada es nula.
	 */
	public Flujo(Date fecha, double capital, double interesfijo, double interesvariable, boolean conocido,boolean formulado) throws DatoInvalidoExcepcion{
		if (fecha==null)
			throw new DatoInvalidoExcepcion("La fecha del flujo es nula.");
		
		this.fecha = fecha;
		this.capital = capital;
		this.interesfijo = interesfijo;
		this.interesvariable = interesvariable;
		this.conocido = conocido;
                this.setFormulado(formulado);
	}
	
	/**
	 * @return  Returns the fecha.
	 * @uml.property  name="fecha"
	 */
	public Date getFecha(){
		return fecha;
	}
	
	/**
	 * @return  Returns the capital.
	 * @uml.property  name="capital"
	 */
	public double getCapital(){
		return capital;
	}
	
	public double getInteresFijo(){
		return interesfijo;
	}
	
	public double getInteresVariable(){
		return interesvariable;
	}
	
	/**
	 * Devuelve la suma de la parte fija, variable y del capital que conforman
	 * el flujo.
	 * @return
	 */
	public double getTotal(){
		return capital + interesfijo + interesvariable;
	}
	
	public boolean esConocido(){
		return conocido;
	}
	
	/**
	 * Descuenta el flujo a una fecha especifica utilizando una tasa de interes especificada.
	 * @param interes
	 * @param diasxano
	 * @param fechaAnalisis
	 * @return
	 * @throws DatoInvalidoExcepcion Si el valor del interes es igual o menor a -1, o si la fecha es nula.
	 */
	public double valorDescontado(double interes, int diasxano, Date fechaAnalisis) throws DatoInvalidoExcepcion {
		if (fechaAnalisis==null)
			throw new DatoInvalidoExcepcion("La fecha especificada es nula.");
		
//		long num = (long)(fecha.getTime() - fechaAnalisis.getTime())/(24*60*60*1000);
                long num = ManejadorFlujos.calcualarDias(fechaAnalisis,fecha);
 		return LibreriaOperacionesFinancieras.valorDescontando(getTotal(), num, interes, diasxano);
	}

	public int compareTo(Object o) {
		Flujo flujo = (Flujo)o;
		if (fecha.getTime() < flujo.getFecha().getTime())
			return -1;
		else if (fecha.getTime() > flujo.getFecha().getTime())
			return 1;
		else 
			return 0;				
	}

    public boolean isFormulado() {
        return formulado;
    }

    public void setFormulado(boolean formulado) {
        this.formulado = formulado;
    }

}
